package logica_de_presentacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashSet;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import comun.Capitulo;
import comun.Serie;
import comun.Usuario;
import comun.ValoracionCapitulo;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.gestorCapitulo;
import logica_de_negocio.gestorSerie;
import logica_de_negocio.gestorValoracionCapitulo;

public class internalLCUsus extends JInternalFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JTable tablaDatos;
	private JButton jbDetalles, jbValoracion, jbSalir;
	private JScrollPane scrollPane;
	private JPanel jpBotones;
	private HashSet<Capitulo> lcVal;
	private Usuario usuarioActual;

	public internalLCUsus(Usuario usuarioActual) {

		super("Capitulo valorado por el usuario--> "
				+ usuarioActual.getUsuario(), true, false, false, false);
		this.usuarioActual = usuarioActual;
		this.setVisible(true);
		this.setSize(500, 500);

		this.subCompo();

	}

	public void subCompo() {

		this.getContentPane().setLayout(new BorderLayout());
		// TABLA

		// CREAMOS UN SCROLLPANE Y LE ANADIMOS LA TABLA
		scrollPane = new JScrollPane(tablaDatos);

		// ANADIMOS EL SCROLLPANE AL PANEL
		this.add(scrollPane, "Center");

		jpBotones = new JPanel(new FlowLayout());

		jbDetalles = new JButton("Ver detalles");
		jbDetalles.addActionListener(this);
		jbDetalles.setMnemonic(KeyEvent.VK_V);
		jbDetalles
				.setToolTipText("Muestra mas detalles del capitulo selecionada");
		jpBotones.add(jbDetalles);

		jbValoracion = new JButton("Ver valoracion");
		jbValoracion.addActionListener(this);
		jbValoracion.setMnemonic(KeyEvent.VK_V);
		jbValoracion.setToolTipText("Ver la Valoracion del capitulo");
		jpBotones.add(jbValoracion);

		jbSalir = new JButton("Salir");
		jbSalir.addActionListener(this);
		jbSalir.setMnemonic(KeyEvent.VK_S);
		jbSalir.setToolTipText("Salir  de la tabla");
		jpBotones.add(jbSalir);

		this.getContentPane().add(jpBotones, "South");

	}

	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsado = (JButton) e.getSource();

		if (botonPulsado == jbValoracion) {

			try {
				String titulo = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);
				String nombre = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 2);
				int num_cap = (int) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 4);

				gestorSerie gs = new gestorSerie();
				gestorCapitulo gc = new gestorCapitulo();
				Serie s = gs.getSerie(titulo);
				Capitulo cap = gc.getCapitulo(s.getId_s(), nombre, num_cap);
				gestorValoracionCapitulo gvc = new gestorValoracionCapitulo();
				ValoracionCapitulo vc = gvc.getValoracionCapitulo(
						usuarioActual.getId_u(), cap.getId_c());

				JOptionPane.showMessageDialog(new Frame(), vc.toString());
			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			} catch (NullPointerException sinEle2) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			} catch (FaltanDatosEnLaBaseDeDatos e1) {
				JOptionPane.showMessageDialog(new Frame(), e1.getFalta());
			} catch (ClassNotFoundException e1) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay informacion en la base de datos");
				this.dispose();
			}

		}

		if (botonPulsado == jbDetalles) {

			try {
				String titulo = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);
				String nombre = (String) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 2);
				int num_cap = (int) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 4);

				gestorSerie gs = new gestorSerie();
				gestorCapitulo gc = new gestorCapitulo();
				Serie s = gs.getSerie(titulo);
				Capitulo cap = gc.getCapitulo(s.getId_s(), nombre, num_cap);

				JOptionPane.showMessageDialog(new Frame(), cap.toString());

			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			} catch (NullPointerException sinEle2) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			} catch (FaltanDatosEnLaBaseDeDatos e1) {
				JOptionPane.showMessageDialog(new Frame(), e1.toString());
			} catch (ClassNotFoundException e1) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay informacion en la base de datos");
				this.dispose();
			}
		}

		if (botonPulsado == jbSalir) {
			this.dispose();
		}
	}

	public void cargarCapitulos() throws ClassNotFoundException {// DAMOS LAS
																	// PELICULAS
																	// GUARDADAS
		gestorCapitulo gc = new gestorCapitulo();
		gestorValoracionCapitulo gvc = new gestorValoracionCapitulo();
		HashSet<Integer> id_Val = gvc
				.getId_cFromValoracionesCapitulo(usuarioActual.getId_u());
		lcVal = gc.getCapitulos(id_Val);
		crearTabla();
		this.setVisible(true);
		subCompo();
	}

	public void crearTabla() throws ClassNotFoundException {

		tablaDatos = null;// VACIAMOS SI EXISTE ALUGUNA
		myTable tmp = new myTable();
		tablaDatos = new JTable(tmp);

		tablaDatos.setPreferredScrollableViewportSize(new Dimension(200, 200));
		tablaDatos.setEnabled(true);

		// QUE PODAMOS SELECIONAR LAS FILAS
		tablaDatos.setRowSelectionAllowed(true);

		// QUE SE ACTUALICE (La tabla que contiene)
		tmp.fireTableDataChanged();

		// SI QUEREMOS QUE LA TABLA LLENE POR COMPLETO LA VENTANA EN LA ALTURA
		tablaDatos.setFillsViewportHeight(false);

		// CREAR UNA ORDENACION AUTOMATICA
		tablaDatos.setAutoCreateRowSorter(true);

	}

	public Serie getSerie(int id_s) throws FaltanDatosEnLaBaseDeDatos,
			ClassNotFoundException {
		gestorSerie gs = new gestorSerie();
		return gs.getSerie(id_s);
	}

	class myTable extends AbstractTableModel {

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private String[] columName = { "Titulo", "Director", "Nombre",
				"N Temp", "N Capitulo" };
		private Object[][] data;

		public myTable() throws ClassNotFoundException {

			super();
			setData();
		}

		@Override
		public int getColumnCount() {
			return columName.length;
		}

		@Override
		public int getRowCount() {
			return data.length;
		}

		@Override
		public String getColumnName(int col) {
			return columName[col];
		}

		@Override
		public Object getValueAt(int row, int col) {

			return data[row][col];
		}

		public void setData() throws ClassNotFoundException {

			int filas = lcVal.size();
			int cont = 0;
			data = new Object[filas][];

			// RELLENO DATOS
			for (Capitulo c : lcVal) {
				Serie s;
				try {
					s = getSerie(c.getId_s());
					Object[] a = { s.getTitulo(), s.getDirector(),
							c.getNombre(), c.getNum_temp(), c.getNum_cap() };
					data[cont] = a;
					cont++;
				} catch (FaltanDatosEnLaBaseDeDatos e) {
					JOptionPane.showMessageDialog(new Frame(), e.getFalta());
				}
			}
		}
	}
}